/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package otcapp.controlador;

import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JCheckBox;
import javax.swing.JOptionPane;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import otcapp.controlador.jinternalFrame.ABMPerfilesPantalla;
import otcapp.controlador.modeloTablas.ModeloTabla;
import otcapp.controlador.modeloTablas.ModeloTablaPerfiles;
import otcapp.controlador.modeloTablas.ModeloTablaPermisosPerfil;
import otcapp.controlador.seguridadDecoradores.FabricaContrladores;
import otcapp.dto.PermisoPerfilDTO;
import otcapp.experto.ExpertoSeguridad;
import otcapp.experto.excepciones.ExpertoSeguridadException;
import otcapp.fabricas.FabricaExpertos;
import otcapp.seguridad.Perfil;
import otcapp.seguridad.Permiso;
import otcapp.utiles.tablas.CellEditorCheckBox;
import otcapp.utiles.tablas.CellRenderCheckbox;

/**
 *
 * @author diego
 */
public class ABMPerfilesControlador implements Controlador {

    ABMPerfilesPantalla pantalla;
    ExpertoSeguridad experto;
    Perfil perfilSeleccionado;

    public ABMPerfilesControlador() {
        pantalla = new ABMPerfilesPantalla();
        experto = (ExpertoSeguridad) FabricaExpertos.getInstancia().getExperto(FabricaExpertos.expertos.SEGURIDAD);

        pantalla.getTblPerfiles().setModel(new ModeloTablaPerfiles());
        pantalla.getTblPermisosPerfil().setModel(new ModeloTablaPermisosPerfil());

        pantalla.getTblPermisosPerfil().getColumn("").setCellRenderer(new CellRenderCheckbox());
        pantalla.getTblPermisosPerfil().getColumn("").setCellEditor(new CellEditorCheckBox(new JCheckBox()));

        pantalla.getTblPerfiles().getSelectionModel().addListSelectionListener(new ListSelectionListener() {
            @Override
            public void valueChanged(ListSelectionEvent e) {
                seleccionarPerfil();
            }
        });

        pantalla.getBtnGuardar().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                guardarPerfil();
            }
        });

        pantalla.getBtnNuevo().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                nuevoPerfil();
            }
        });

        pantalla.getBtnSalir().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                finalizar();
            }
        });
    }

    @Override
    public void iniciar() {
        pantalla.setVisible(true);
        ((ModeloTablaPerfiles) pantalla.getTblPerfiles().getModel()).setListaElementos(experto.buscarPerfiles());
        ((ModeloTablaPermisosPerfil) pantalla.getTblPermisosPerfil().getModel()).setListaElementos(buscarPermisos());
    }

    @Override
    public void finalizar() {
        limpiarTablaPermisosPerfil();
        pantalla.getTxtDescripcionPerfil().setText("");
        pantalla.getTxtNombrePerfil().setText("");
        pantalla.setVisible(false);
        ((ControladorPrincipal)FabricaContrladores.getInstancia().getControlador(FabricaContrladores.controlador.PRINCIPAL)).iniciarContrlador(ControladorPrincipal.controlador.USUARIO);
    }

    @Override
    public Component getPantalla() {
        return pantalla;
    }

    @Override
    public void continuar() {
        pantalla.toFront();
        pantalla.setVisible(true);
    }

    private List buscarPermisos() {
        List<Permiso> permisos;
        permisos = experto.buscarPermisos();
        List<PermisoPerfilDTO> permisosPerfilDTO;
        permisosPerfilDTO = new ArrayList<>();
        for (Permiso permiso : permisos) {
            permisosPerfilDTO.add(new PermisoPerfilDTO(permiso));
        }

        return permisosPerfilDTO;
    }

    private void seleccionarPerfil() {
        int fila = pantalla.getTblPerfiles().getSelectedRow();
        if (fila != -1) {
            int filaModelo = pantalla.getTblPerfiles().convertRowIndexToModel(fila);
            perfilSeleccionado = (Perfil) ((ModeloTablaPerfiles) pantalla.getTblPerfiles().getModel()).getRow(filaModelo);
            pantalla.getTxtNombrePerfil().setText(perfilSeleccionado.getNombrePerfil());
            pantalla.getTxtDescripcionPerfil().setText(perfilSeleccionado.getDescripcion());
            seleccionarPermisosPerfil(perfilSeleccionado);
        }
    }

    private void seleccionarPermisosPerfil(Perfil perfil) {

        limpiarTablaPermisosPerfil();

        if (perfil.getPermisos() == null) {
            return;
        }
        for (Permiso permiso : perfil.getPermisos()) {
            List<PermisoPerfilDTO> listadoPermisosDTO = ((ModeloTablaPermisosPerfil) pantalla.getTblPermisosPerfil().getModel()).getListaElementos();
            for (PermisoPerfilDTO permisoPerfilDTO : listadoPermisosDTO) {
                if (permiso.getId().equals(permisoPerfilDTO.getPermiso().getId())) {
                    permisoPerfilDTO.setActivo(true);
                }
            }
            ((ModeloTabla) pantalla.getTblPermisosPerfil().getModel()).fireTableDataChanged();
        }
    }

    private void limpiarTablaPermisosPerfil() {
        List<PermisoPerfilDTO> listadoPermisosDTO = ((ModeloTablaPermisosPerfil) pantalla.getTblPermisosPerfil().getModel()).getListaElementos();
        for (PermisoPerfilDTO permisoPerfilDTO : listadoPermisosDTO) {
            permisoPerfilDTO.setActivo(false);
        }
        ((ModeloTabla)pantalla.getTblPermisosPerfil().getModel()).fireTableDataChanged();
    }

    private void guardarPerfil() {
        boolean estaEnPerfilSeleccionado = false;
        List<PermisoPerfilDTO> permisosSeleccionados = ((ModeloTabla) pantalla.getTblPermisosPerfil().getModel()).getListaElementos();
        for (PermisoPerfilDTO permisoPerfilDTO : permisosSeleccionados) {
            for (Permiso permiso : perfilSeleccionado.getPermisos()) {
                if (permiso.getId().equals(permisoPerfilDTO.getPermiso().getId())) {
                    estaEnPerfilSeleccionado = true;
                    if (!permisoPerfilDTO.isActivo()) {
                        perfilSeleccionado.getPermisos().remove(permisoPerfilDTO.getPermiso());
                    }
                }
            }
            if (!estaEnPerfilSeleccionado && permisoPerfilDTO.isActivo()) {
                perfilSeleccionado.addPermiso(permisoPerfilDTO.getPermiso());
            }
            estaEnPerfilSeleccionado = false;
        }
        perfilSeleccionado.setNombrePerfil(pantalla.getTxtNombrePerfil().getText());
        perfilSeleccionado.setDescripcion(pantalla.getTxtDescripcionPerfil().getText());
        try {
            experto.guardarPerfil(perfilSeleccionado);
        } catch (ExpertoSeguridadException ex) {
            JOptionPane.showMessageDialog(pantalla, ex.getMessage(), "ERROR", JOptionPane.ERROR_MESSAGE);
        }
        JOptionPane.showMessageDialog(pantalla, "Perfil guardado correctamente", "INFORMACIÓN", JOptionPane.INFORMATION_MESSAGE);
        ((ModeloTabla) pantalla.getTblPerfiles().getModel()).fireTableDataChanged();
    }

    private void nuevoPerfil() {
        perfilSeleccionado = new Perfil();
    }
}
